#pragma once
#include <iostream>
#include <string>
#include <ctemplate/template.h>
#include "../comm/util.hpp"
#include "../comm/log.hpp"
// #include "oj_model.hpp"
#include "oj_model_mysql.hpp"

namespace ns_view
{
  using namespace ns_util;
  using namespace ns_log;

  // 待渲染网页路径
  const static std::string template_path = "./template_html/";

  using namespace ns_model;

  class View
  {
  public:
    View() {}
    ~View() {}

    bool AllExpandHtml(std::vector<Question> &all, std::string &html)
    {

      if (all.size() == 0)
      {
        LOG(FATAL) << "准备渲染所有题目列表的网页，但题目列表为空" << std::endl;
        exit(-1);
      }

      // 待渲染网页
      std::string in_html = template_path + "all_question.html";

      // 创建数据字典
      ctemplate::TemplateDictionary dic("all_quetion"); // 这个名字可以随便取，因为有待渲染的网页的路径，所以无所谓

      for (auto &elm : all)
      {
        ctemplate::TemplateDictionary* sub = dic.AddSectionDictionary("question_list");

        /**
         * 创建子字典
         * 子字典名称不能随意取，它决定最后循环渲染的是哪部分，
         * 当然，如果你没有子字典，说明你不需要循环渲染，只有一个主字典
         * 那就像上面说的，主字典怎么取都无所谓，因为只要进行一次kv映射就结束了，整个网页一共就一个要渲染的，那就不用区分
         * */
        sub->SetValue("number", elm.number);
        sub->SetValue("title", elm.title);
        sub->SetValue("star", elm.star);
        //LOG(INFO) << "创建子字典成功" << std::endl;
      }

      /**
       * 获取拥有渲染网页功能的对象
       **/
      ctemplate::Template *tpl = ctemplate::Template::GetTemplate(in_html, ctemplate::DO_NOT_STRIP);

      // std::string out_html; //接受被渲染后的网页

      // tpl->Expand(&out_html, &dic);

      // dic中包含所有子字典
      tpl->Expand(&html, &dic);
      return true;
    }

    bool OneExpandHtml(Question &ques, std::string &html)
    {

      // 待渲染网页
      std::string in_html = template_path + "one_question.html";

      /**
       * 创建数据字典
       * 因为只要渲染一次，所以不需要子字典
       */

      ctemplate::TemplateDictionary dic("one_question");

      dic.SetValue("number", ques.number);
      dic.SetValue("title", ques.title);
      dic.SetValue("star", ques.star);
      dic.SetValue("desc", ques.desc);
      dic.SetValue("header", ques.header);

      // 创建具有渲染网页功能的对象
      ctemplate::Template *tpl = ctemplate::Template::GetTemplate(in_html, ctemplate::DO_NOT_STRIP);

      tpl->Expand(&html, &dic);

      return true;
    }
  };

}
